package edu.amm.fanal.methods;

import edu.amm.fanal.api.Coordinates.CoordinatesType;
import edu.amm.fanal.api.Function;
import edu.amm.fanal.api.FunctionalSpace.SpaceType;
import edu.amm.fanal.api.LebesgueSpace;

/**
 * Метод Галёркина.
 * 
 * @author Иванов Илья
 * @since 2013-05-15
 *
 */
public class GalerkinMethod extends MomentsMethod {
	
	/**
	 * @param coordinatesType Тип координатной системы.
	 */
	public GalerkinMethod(CoordinatesType coordinatesType) {
		super(SpaceType.LEBESGUE, coordinatesType);
	}
	
	public String getName() {
		return getMethodName();
	}
	
	protected double getMatrixCoefficient(final int i, final int j) {
		// Вычисляем скалярное произведение (Aej, ei)
		Function Aej = zeroProblem.applyLeftHandOperator(basis[j]);
		Function ei = basis[i];
		
		return ((LebesgueSpace) space).scalarProduct(Aej, ei);
	}
	
	protected double getRightHandElement(int i) {
		// Вычисляем скалярное произведение (f, ei)
		Function ei = basis[i];
		Function f = zeroProblem.getF();
		
		return ((LebesgueSpace) space).scalarProduct(f, ei);
	}
	
	public static String getMethodName() {
		return "Метод Галёркина";
	}
}